package com.joizhang.seckill.utils;

public class MySingleton {

    private static MySingleton instance;

    private MySingleton() {
    }

    /**
     * 1 懒汉式-线程不安全
     */
    public static MySingleton getInstance() {
        if (instance == null) {
            instance = new MySingleton();
        }
        return instance;
    }

    /**
     * 2 采取直接实例化 uniqueInstance 的方式就不会产生线程不安全问题
     */
    private static final MySingleton STATIC_INSTANCE = new MySingleton();

    /**
     * 3 懒汉式-线程安全
     */
    public static synchronized MySingleton getSyncInstance() {
        if (instance == null) {
            instance = new MySingleton();
        }
        return instance;
    }

    /**
     * 4 双重校验锁-线程安全
     */
    private volatile static MySingleton volatileInstance;

    public static MySingleton getDoubleCheckInstance() {
        if (volatileInstance == null) {
            synchronized (MySingleton.class) {
                if (volatileInstance == null) {
                    /*
                    a) 为 volInstance 分配内存空间
                    b) 初始化 volInstance
                    c) 将 volInstance 指向分配的内存地址
                     */
                    volatileInstance = new MySingleton();
                }
            }
        }
        return volatileInstance;
    }

    /**
     * 5 静态内部类实现，线程安全
     * 只有当调用 Singleton.getInstance 时，程序才会访问 MySingletonHolder.STATIC_INNER_INSTANCE，
     * 才会触发对 LazyHolder 的初始化（对应第 4 种情况），继而新建一个 Singleton 的实例。
     * 由于类初始化是线程安全的，并且仅被执行一次，因此程序可以确保多线程环境下有且仅有一个 Singleton 实例。
     */
    private static class MySingletonHolder {
        private static final MySingleton STATIC_INNER_INSTANCE = new MySingleton();
    }

    public static MySingleton getStaticInnerInstance() {
        return MySingletonHolder.STATIC_INNER_INSTANCE;
    }

    /**
     * 6 枚举实现：该实现可以防止反射攻击
     */
}
